/**
 * rsLightbox
 * 
 * Obiekt lightboxa. Dostarcza metody tworzące tło.
 * 
 * wymaga:
 *  jQuery 1.4
 * 
 * @param JSON options Zawiera tablicę z ustawieniami Lightboxa
 * 
 * @author Dawid Stępień
 * @version 1.0
 */

var rsLightbox = function(options)
{
   /**
    * Obiekt bazowy
    */
	var self = {};


   /**
    * Atrybuty
    */

   /*
    * Atrybut zawierający wartość z-index, inkrementowany
    * dla kolejnych warstw lightboxa
    */
	var zIndex = 1000;

   /*
    * Ustawienia domyślne
    */
    var defaults = {
    	loaderImg         : 'img/loader.gif', // Relatywna ścieżka do grafiki loadera
    	loaderAlt         : 'Loading...',     // Atrybut alt
    	displayDuration   : 0,                // Czas trwania display
    	fadeDuration      : 0,                // Czas trwania fade
    	opacity           : 0.8,              // Przeźroczystość tła
    	color             : 'black',          // Kolor tła
    	lightboxId        : 'rsLightbox',     // Atrubut ID lightboxa
    	loader            : {                 // Ustawienie loadera
            id        : 'rsLoader',              // Atrybut id
            src       : 'img/loader.gif',        // Atrybut src
            alt       : 'Loading...',            // Atrybut alt
            marginTop : 180                      // Odległość loadera od górnej krawędzi okna
        }
    };

   /*
    * Rozszerzenie lub nadpisanie domyślnych ustawień przez
    * przekazane w options
    */
    var settings = $.extend(defaults, options);

   /*
    * Style lightboxa oraz loadera
    */
    var styles = {
		lightbox : {
			'position'         : 'fixed',
			'display'		   : 'none',
			'top'			   : 0,
			'left'			   : 0,
			'z-index'		   : zIndex,
			'opacity'		   : settings.opacity,
			'background-color' : settings.color,
			'height'		   : '100%',
			'width'			   : '100%'
		},
		loader  : {
			'position'          : 'fixed',
			'display'           : 'none',
			'top'               : 0,
			'left'              : 0,
 			'z-index'           : zIndex+1,
 			'opacity'           : 1
		}
    };

   /*
    * Zmienna przechowująca obiekt lightboxa. Domyślnie próbuje
    * go pobrać poprzez domyślne ID
    */
    var lightbox = $(settings.lightboxID);

   /*
    * Zmienna przechowująca obiekt loadera. Domyślnie próbuje
    * go pobrać poprzez domyślne ID
    */
    var loader   = $(settings.loader.id);


   /**
    * Metody tworzące elementy
    */

   /*
    * Utworzenie lightboxa.
    * 
    * Jeśli nie udało się pobrać lightboxa do zmiennej
    * 'lightbox' to tworzy nowy.
    */
    self.createLightbox = function()
    {
    	if(!lightbox.length)
    	{
    		lightbox = $('<div />', {
    			'id' : settings.lightboxId,
    			css  : styles.lightbox
    		}).prependTo('body');
    	}

       /*
        * Ustaw element lightboxa widoczny 
        * dla obiektów dziedziczących
        */
    	self.lightbox = lightbox;

    }; //Koniec createLightbox()

   /*
    * Utworzenie loadera.
    * 
    * Jeśli nie udało się pobrać loader do zmiennej
    * 'loader' to tworzy nowy
    */
    self.createLoader = function()
    {
        if(!loader.length)
     	{
     		loader = $('<img />', {
     			'id'  : settings.loader.id,
     			'src' : settings.loader.src,
     			'alt' : settings.loader.alt,
     			css   : styles.loader
     		});

     		lightbox.after(loader);
     	}

       /*
        * Wyśrodkuj loader
        */
     	self.windowCenter(loader, settings.loader.marginTop);

       /*
        * Przypisz zdarzenie wyśrodkowania w przypadku zmiany
        * rozmiaru okna
        */
     	self.windowOnResize(function()
     	{
     		self.windowCenter(loader, settings.loader.marginTop);
        });

       /*
        * Ustaw element loadera widoczny dla 
        * obiektów dziedziczących
        */
     	self.loader = loader;

     }; //Koniec createLoader()


   /**
    * Metody odpowiedzialne za wyświetlanie
    */

   /*
    * Wyświetla lightbox oraz przekazany element
    * 
    * @param jQuery element Obiekt do wyświetlenia wraz z lightboxem
    * @param bool showLightbox Czy wyświetlić lightbox (domyślnie true)
    */
    self.show = function(element, showLightbox)
    {
    	if(showLightbox == undefined)
    		showLightbox = true;

       /*
        * Jeśli ustawiony jest czas trwania fade to
        * użyj fadeIn do pokazania lightboxa
        */
    	if(settings.fadeDuration)
    	{
    		if(showLightbox)
    			lightbox.fadeIn(settings.fadeDuration);

    		if(element != undefined)
    			element.fadeIn(settings.fadeDuration);
    	}
    	else
    	{
    		if(showLightbox)
    			lightbox.show(settings.duration);

    		if(element != undefined)
    			element.show(settings.duration);
    	}
    }; //Koniec show()


   /*
    * Ukrycie lightboxa oraz przekazanego elementu.
    * 
    * @param jQuery element Element do ukrycia wraz z lightboxem
    * @param bool hideLightbox Czy ukryć lightboxa (domyślnie true)
    */
    self.hide = function(element, hideLightbox)
    {
    	if(hideLightbox == undefined)
    		hideLightbox = true;

       /*
        * Jeśli ustawiony jest czas trwania fade to
        * użyj fadeOut do ukrycia lightboxa
        */
    	if(settings.fadeDuration)
    	{
    	   /*
            * Schowaj loader
            */
            loader.fadeOut(settings.fadeDuration);

            if(element != undefined)
                element.fadeOut(settings.fadeDuration);

    		if(hideLightbox)
    			lightbox.fadeOut(settings.fadeDuration);
    	}
    	else
    	{
           /*
            * Schowaj loader
            */
            loader.hide(settings.duration);

    		if(hideLightbox)
    			lightbox.hide(settings.duration);

    		if(element != undefined)
    			element.hide(settings.duration);
    	}
    }; //Koniec hide()

   /*
    * Wycentruj element w poziomie oraz nadaj
    * wysokość w pionie względem rozmiarów okna.
    * 
    * @param jQuery element Element do wycentrowania
    * @param integer top Odległość od górnej krawędzi okna (domyślnie 0) 
    */
    self.windowCenterHorizontal = function(element, top)
    {
    	var windowWidth  = $(window).width();                   // Szerokości okna
    	var elementWidth = element.width();                     // Szerokość elementu
        var left         = (windowWidth/2) - (elementWidth/2);  // Obliczenie odległości od lewej

    	if(top == undefined) top = 0;

    	var elementPosition = {
    		'top' : top,
    		'left': left
    	};

    	element.css(elementPosition);
    }; //Koniec windowCenterHorizontal(top)

   /*
    * Wycentruj element względem rozmiarów okna z marginesem
    * ujemnym wg parametru top.
    */
    self.windowCenter = function(element, marginTop)
    {
       /*
        * Pobierz wymiary okna
        */
    	var windowWidth   = $(window).width();
    	var windowHeight  = $(window).height();

       /*
        * Pobierz wymiary elementu
        */
    	var elementWidth   = element.width();
    	var elementHeight  = element.height();

       /*
        * Określ położenie
        */
    	var left = (windowWidth/2) - (elementWidth/2);
    	var top  = ((windowHeight/2) - (elementHeight/2)) - marginTop;

       /*
        * Jeśli top jest mniejszy od zadanej to
        */
    	if(top < marginTop) top = marginTop;
    	
    	var elementPosition = {
    		'top' : top,
    		'left': left
    	};

       /*
        * Nadaj położenie
        */
    	element.css(elementPosition);
    };

   /*
    * Nadanie przekazanej funkcji dla zdarzenia
    * zmiany rozmiaru okna.
    */
    self.windowOnResize = function(event)
    {
        $(window).resize(event);
    }; //Koniec windowOnResize(event)

   /*
    * Zwraca z-index powiększony o 1
    */
    self.getIndex = function()
    {
    	zIndex += 1;

    	return zIndex;
    }; //getIndex()


   /**
    * Metody odpowiedzialne za zdarzenia
    */ 

   /*
    * Zdarzenie kliknięcia w lightbox
    */
    self.setClickEvent = function(event)
    {
       /*
        * Usuń przypisane kliknięcia
        */
    	lightbox.unbind();

       /*
        * Nadaj zdarzenie kliknięcia
        */	
    	lightbox.click(event);

    }; //Koniec setClickEvent


   /**
    * Konstruktor
    */
    self.__construct = function()
    {
       /*
        * Utwórz lightbox
        */
    	self.createLightbox();

       /*
        * Nadaj domyślne zdarzenie zniknięcia po kliknięciu
        * w lightbox
        */
    	self.setClickEvent(function()
    	{
    		self.hide(); //Ukryj lightboxa
    	});
    }; //Koniec __construct()


    /**
     * Wywołaj konstruktor
     */
     self.__construct();

    /**
     * Zwróć obiekt
     */
     return self;

}; //Koniec lightbox(style)

































